package com.augurit.common.system.service.org;

import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;
import org.springside.modules.orm.Page;

import com.augurit.common.base.form.ResultForm;
import com.augurit.common.base.service.IBaseService;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.system.web.org.form.OmOrgForm;
import com.augurit.common.system.web.org.form.OmPositionForm;
import com.augurit.common.system.web.org.form.OmUserForm;
import com.augurit.common.system.web.org.form.OmUserGroupForm;
import com.augurit.common.system.web.org.form.OmUserOrgForm;
import com.augurit.common.system.web.org.form.OmUserPositionForm;

/**
 * 用户接口
 */
public interface IOmUserService extends IBaseService<OmUserForm, Long> {
	
	
	/**
	 * 获取用户基本信息
	 * @param loginName 用户登录名
	 * @return
	 */
	public OmUserForm get(String loginName);
	
	/**
	 * 检验登录用户的用户名和密码是否正确
	 * @param loginName 用户登录名
	 * @param password 用户密码
	 * @return
	 */
	public boolean isValid(String loginName, String password);
	
	/**
	 * 根据登录用户的用户名和密码获取用户对象
	 * @param loginName 用户登录名
	 * @param password 用户密码
	 * @return 如用户名和密码正确则返回用户对象，否则返回NULL
	 */
	public OmUserForm getValidUser(String loginName, String password);
	

	/**
	 * 根据主键id删除本用户节点以及关联的机构，岗位，工作组
	 * @param id 用户节点主键
	 */
	public void deleteUserCascade(Long id);
	
	/**
	 * 删除用户与机构的关联，不删除用户本身
	 * @param userId 用户主键
	 * @param orgId  机构主键
	 */
	public void deleteUserFromOrg(Long userId, Long orgId,boolean flag);
	
	/**
	 * 删除用户与岗位的关联，不删除用户本身
	 * @param userId 用户主键
	 * @param posId 岗位主键
	 */
	public void deleteUserFromPos(Long userId, Long posId);
	
	/**
	 * 删除用户与工作组的关联，不删除用户本身
	 * @param userId 用户主键
	 * @param groupId 工作组主键
	 */
	public void deleteUserFromGroup(Long userId, Long groupId);
	
	
	/**
	 * 给定用户id数组，获取在id数组中的分页查询
	 * @param userIds 用户id数组 
	 * @return
	 */
	public Page<OmUserForm> getUsersInUserIds(Page<OmUserForm> page, OmUserForm form, Long[] userIds);
	
	/**
	 * 给定用户id数组，获取不在id数组中的分页查询
	 * @param page
	 * @param userIds
	 * @return
	 */
	public Page<OmUserForm> getUsersNotInUserIds(Page<OmUserForm> page, OmUserForm form, Long[] userIds);
	
	/**
	 * 根据机构主键orgId获取关联用户集合
	 * @param uoId OmUserOrg主键集合
	 * @return 用户集合
	 */
	public List<OmUserForm> getUsers(Long orgId);
	
	/**
	 * 根据机构主键orgId分页查询关联用户集合
	 * @param orgId 机构主键
	 * @param page 分页对象
	 * @return 分页的用户集合
	 */
	public Page<OmUserForm> getUsers(Long orgId,Page<OmUserForm> page);
	
	/**
	 * 根据工作组主键groupId分页查询关联用户集合
	 * @param groupId 工作组主键
	 * @param page 分页对象
	 * @return 分页的用户集合
	 */
	public Page<OmUserForm> getUsersByGroup(Long groupId, Page<OmUserForm> page);
	
	/**
	 * 移动用户到另一岗位
	 * @param  userId 用户主键
	 * @param oldPosId 用户原来所在的岗位
	 * @param targetPosId 要移动到的岗位主键
	 * */
	public void moveUserToPosition(Long userId,Long oldPosId,Long targetPosId);
	
	/**
	 * 移动用户到另一机构
	 * @param  userId 用户主键
	 * @param targetOrgId 要移动到的机构主键
	 * */
	public void moveUserToOrg(Long userId, Long oldOrgId,Long targetOrgId);
	
	
	/**
	 * 根据机构主键posId获取关联用户集合
	 * @return 用户集合
	 */
	public List<OmUserForm> getUsersByPosId(Long posId);
	
	/**
	 * 根据机构主键orgId分页查询关联用户集合
	 * @param orgId 机构主键
	 * @param page 分页对象
	 * @return 分页的用户集合
	 */
	public Page<OmUserForm> getUsersByPosId(Long posId, Page<OmUserForm> page);
	
	/**
	 * 判断该用户是否是超级管理员
	 * @param userId 用户主键
	 * @return bool 如果用户是超级管理员，返回true;否则，返回false
	 * */
	public boolean isSystemAdmin(Long userId);
	
	
	
/*****************带userId参数的方法************/

	/**
	 * 判断管理用户是否具有指定用户数组的全部管理权限，
	 * 若有全部管理权限，返回true；否则，返回false；
	 * @param adminUserId 管理用户主键
	 * @param userIds 指定用户主键或主键数组
	 * @return 
	 * */
	public boolean canManageUser(Long adminUserId, Long... userId);
	
	
	/**
	 * 若管理用户拥有权限，则根据用户主键获取用户对象，否则返回没有该用户管理权限信息
	 *@param adminUserId 登陆用户主键
	 *@param userIds 用户主键或主键数组
	 *@return 拥有管理权限时，返回查询的用户对象，否则，返回失败的信息
	 * */
	public ResultForm<OmUserForm> get(Long adminUserId, Long userId);
	
	
	/**
	 * 根据权限保存用户对象列表，若有全部用户的管理权限，则保存，
	 * 否则返回没有管理权限信息
	 * @param adminUserId 管理用户主键
	 * @param forms 用户form对象或对象数组
	 * @return 是否成功保存的信息
	 * */
	public ResultForm<Object> save(Long adminUserId, OmUserForm... forms);
	
	
	/**
	 * 如果登陆用户具有指定用户列表的全部权限，则可以进行删除操作，
	 * 否则删除失败
	 * @param adminUserId 登陆用户主键
	 * @param userIds 用户z主键或主键数组
	 * @return 是否成功删除的信息
	 * */
	public ResultForm<Object> delete(Long adminUserId, Long... userIds);
	
	
	/**
	 * 关联删除用户，先判断管理用户是否拥有指定用户的管理权限，
	 * 若有，则返回成功删除信息；否则，返回删除失败信息
	 * @param adminUserId 管理用户主键
	 * @param userIds 用户主键或主键数组
	 * @return 是否成功关联删除的信息
	 * */
	public ResultForm<Object> deleteUserCascade(Long adminUserId, Long userId);
	
	/**
	 * 根据机构主键orgId获取关联用户集合，先判断该用户是否有权限查询该机构
	 * @param uoId OmUserOrg主键集合
	 * @return 用户集合
	 */
	public List<OmUserForm> getUsers(Long adminUserId, Long orgId);
	

	/**
	 * 根据机构主键posId获取关联用户集合，
	 * 先判断该用户是否有权限查询该岗位所关联的机构，
	 * 若该用户有对该机构有权限，则对岗位也就有权限
	 * @param userId 用户主键
	 * @param posId 岗位主键
	 * @return 用户集合
	 */
	public ResultForm<List<OmUserForm>> getUsersByPosId(Long adminUserId, Long posId);
	
	
	/**
	 * 根据查询面板的查询条件查询机构，条件为OmUserForm的5个属性:
	 * userCode,userName,sex,status,position
	 * @param form 条件查询对象 
	 * @Param page 分页对象
	 * @return 符合条件的分页查询结果
	 */
	public Page<OmUserForm> searchUser(Long adminUserId,OmUserForm form, Page<OmUserForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 获取机构下但是不属于指定工作组下的用户（包含它的所有子机构）
	 * @param orgId 机构id
	 * @param groupId 工作组id
	 * @param form 查询条件
	 * @param page 分页条件
	 * @return
	 */
	public Page<OmUserForm> getUsersInOrgButNotInGroup(Long orgId, Long groupId, OmUserForm form, Page<OmUserForm> page);
	
	/**
	 * 获取机构下不拥有指定岗位的所有用户，包括子机构下的用户
	 * @param orgId 机构id
	 * @param posId 岗位id
	 * @param form 查询参数
	 * @param page 分页参数
	 * @return
	 */
	public Page<OmUserForm> getUsersNotHavePos(Long orgId, Long posId, OmUserForm form, Page<OmUserForm> page);
	
	/**
	 * 获取不在指定机构中的用户
	 * @param orgId
	 * @param page
	 * @return
	 */
	public Page<OmUserForm> getUsersNotInOrg(Long orgId, OmUserForm form, Page<OmUserForm> page);
	
	/**
	 * 分页查询全部机构form 对象
	 * @param page 分页对象
	 * @return 分页处理后的全部机构form 对象
	 * */
	public Page<OmUserForm> getAll(Page<OmUserForm> page);
	
	
	/**
	 * 在机构下新增用户
	 * @param form 用户对象
	 * @param orgId 机构id
	 * */
	public void addUserToOrg(OmUserForm form ,Long orgId);
	
	
	/**
	 * 在机构岗位下新增用户
	 * @param form 用户对象
	 * @param posId 岗位id
	 * */
	public void addUserToOrgPos(OmUserForm form ,Long posId);
	
	public void associateUserToOrg(Long userId, Long orgId);
	
	/**
	 * 获取指定用户所属机构列表
	 * @param userId
	 * @return
	 */
	public Page<OmUserOrgForm> getRelatedOrgs(Page<OmUserOrgForm> page, Long userId);
	
	/**
	 * 获取指定用户所属工作组列表
	 * @param userId
	 * @return
	 */
	public Page<OmUserGroupForm> getRelatedGroups(Page<OmUserGroupForm> page, Long userId);

	/**
	 * 获取指定用户所属岗位列表
	 * @param page
	 * @param userId 用户id
	 * @param posType 岗位类型
	 * @return
	 */
	public Page<OmUserPositionForm> getRelatedPositions(Page<OmUserPositionForm> page, Long userId, String posType);
	
	/**
	 * 根据OmUserOrg对象ID数组作删除
	 * @param uoIds OmUserOrg对象ID数组
	 */
	public void deleteOmUserOrg(Long[] uoIds);
	
	/**
	 * 根据OmUserGroup对象ID数组作删除
	 * @param ugIds OmUserGroup对象ID数组
	 */
	public void deleteOmUserGroup(Long[] ugIds);
	
	/**
	 * 根据OmUserPosition对象ID数组作删除
	 * @param upIds OmUserPosition对象ID数组
	 */
	public void deleteOmUserPosition(Long[] upIds);
	
	/**
	 * 设置主机构
	 * @param userId 用户ID
	 * @param orgId 机构ID
	 */
	public void setMainOrg(Long userId, Long orgId);
	
	/**
	 * 设置主岗位
	 * @param userId 用户ID
	 * @param posId 岗位ID
	 */
	public void setMainPos(Long userId, Long posId);
	
	/**
	 * 获取用户名称
	 * @param loginName 用户登录名
	 * @return
	 */
	public String getUserName(String loginName);
	
	/**
	 * 根据用户登陆名数组查找用户列表
	 * @param roleCode 角色编号
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<OmUserForm> getUsersLoginNames(String loginNames[]);
	
	/**
	 * 根据岗位主键列表查询关联的用户loginName列表
	 * @param posIds
	 * @return
	 */
	public List<OmUserForm> getUsersByPosIds(List<Long> posIds);
	
	/**
	 * 根据机构主键列表获取关联用户用户名列表
	 * @param orgIds 机构主键列表
	 * @return 用户主键列表
	 */
	public List<OmUserForm> getUsersByOrgIds(List<Long> orgIds);
	
	public boolean isUserLikeKeyword(Long userId,String keyword);
	
	public List<OmUserForm> getUserByOrgListAndKeyword(List<OmOrgForm>list,String keyword);
	
	public List<OmUserForm> getUserByposListAndKeyword(List<OmPositionForm> list,String keyword);
	
	//om_user表是否有记录匹配关键字
	public boolean hasUserLikeKeyword(List<OmUserForm>list,String keyword);
	
	public OmOrgForm getRelatedMainOrg(Long userId);

	public OmUserForm getUserByName(String assigneeName);

	/**
	 * 余泥业务的人员选择
	 * @param orgId
	 * @return
	 */
	public List<OmUserForm> getSelectUsers(Long orgId,String roleIds);
}
